import { CartItem, IApiRes } from "@/types/data"
import request from "@/utils/request"
import { defineStore } from "pinia"
import useUserStore from './user'
export default defineStore('cart', {
    // 数据持久化, 插件自动存储
    persist: {
        enabled: true
    },
    state: () => ({
        // 购物车列表
        list: [] as CartItem[]
    }),
    actions: {
        // 获取购物车列表
        async getCartList() {
            if (this.isLogin) { // 已登录
                const res = await request.get<IApiRes<CartItem[]>>('/member/cart')
                this.list = res.data.result
            } else { // 未登录
                // 遍历发送请求, 校验更新sku商品的库存和价格, 是否有效
                this.list.forEach(async (cartItem) => {
                    const { skuId } = cartItem
                    // 根据 skuId 获取最新商品信息
                    const res = await request.get<IApiRes<CartItem>>(
                        `/goods/stock/${skuId}`
                    )
                    // 保存最新商品信息
                    const lastCartInfo = res.data.result
                    // 更新商品现价
                    cartItem.nowPrice = lastCartInfo.nowPrice
                    // 更新商品库存
                    cartItem.stock = lastCartInfo.stock
                    // 更新商品是否有效
                    cartItem.isEffective = lastCartInfo.isEffective
                })
            }
        },

        // 清空购物车
        clearCart() {
            // 退出登录需清空购物车
            this.list = []
        },

        // 加入购物车
        async addCart(data: CartItem) {
            // 登录了的情况
            if (this.isLogin) {
                // (1) 加入购物车请求
                await request.post('/member/cart', data)
                // 重新获取购物车列表
                this.getCartList()
            } else { // 没有登录的情况
                // 本地添加购物车
                // (1) 判断购物车列表是否有该商品
                const goods = this.list.find(item => item.skuId === data.skuId)
                if (goods) {
                    goods.count += data.count
                } else {
                    this.list.unshift(data)
                }
            }
        },

        // 删除购物车的商品
        async delCart(skuIds: string[]) {
            if (this.isLogin) {
                await request.delete('/member/cart', {
                    data: { ids: skuIds }
                })
                // 重新获取最新购物车列表
                this.getCartList()
            } else {
                // 为登录
                this.list = this.list.filter(item => !skuIds.includes(item.skuId))
            }
        },

        // 修改购物车商品, 和修改选择状态
        async updateCart(
            skuId: string,
            data: {
                selected?: boolean;
                count?: number
            }
        ) {
            if (this.isLogin) { // 已登录
                await request.put(`/member/cart/${skuId}`, data)
                // 重新获取最新购物车列表
                this.getCartList()
            } else { // 未登录
                let goods = this.effectiveList.find(item => item.skuId === skuId)
                if (!goods) return // 判断商品存不存在
                if (data.count !== undefined) goods.count = data.count // 判断有没有传数量
                if (data.selected !== undefined) goods.selected = data.selected // 判断有没有传选中状态
            }
        },

        // 点了全选, 修改全选或者全不选
        async updateCartAllSelected(isSelected: boolean) {
            if (this.isLogin) { // 已登录
                await request.put('/member/cart/selected', {
                    selected: isSelected,
                })
                // 获取购物车列表
                this.getCartList()
            } else { // 未登录
                this.effectiveList.forEach(item => item.selected = isSelected)
            }
        },

        // 合并购物车
        async mergeLocalCart() {
            const data = this.list.map(({ skuId, selected, count }) => ({
                skuId,
                selected,
                count
            }))
            await request.post('/member/cart/merge', data)
            // 合并成功，重新获取购物车列表
            this.getCartList()
        }
    },
    getters: {
        // 判断是否登录, 也就是判断有没有token
        isLogin(): boolean {
            const user = useUserStore()
            return !!user.profile.token
        },

        // 有效商品列表 , 库存大于 0, 且被勾选了
        // 背景业务：有效商品对应的isEffective = true  
        effectiveList(): CartItem[] {
            return this.list.filter((item) => item.stock > 0 && item.isEffective)
        },

        // 有效商品总数量
        // 把effctiveList中的每一项的count叠加起来
        effectiveListCounts(): number {
            return this.effectiveList.reduce((sum, item) => sum + item.count, 0)
        },

        // 总钱数  = 所有单项的钱数累加  单项的钱数 = 数量 * 单价
        effectiveListPrice(): string {
            return this.effectiveList.reduce((sum, item) => sum + item.count * Number(item.nowPrice), 0).toFixed(2)
        },

        // 是否全选
        isAllSelected(): boolean {
            return (
                // 商品不为 0 的时候才去计算
                this.effectiveList.length !== 0 &&
                this.effectiveList.every((item) => item.selected)
            )
        },

        // 已选择的列表
        selectedList(): CartItem[] {
            return this.effectiveList.filter((item) => item.selected)
        },

        // 已选择的商品总数
        selectedListCounts(): number {
            return this.selectedList.reduce((sum, item) => sum + item.count, 0)
        },

        // 已选择的列表总价
        selectedListPrice(): string {
            return this.selectedList
                .reduce((sum, item) => sum + item.count * Number(item.nowPrice), 0)
                .toFixed(2)
        }
    },
})


